/*
 * ObjetoConstructor.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 11/04/2008, 01:05:38 AM
 */

package com.ufps.cuatro.modelo.representacion;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * <i><b>ObjetoConstructor:</b></i>Esta Clase representa los Constructores Públicos
 * identificados en la Clases del Modelo Analizado (*.jar).
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 11/04/2008
 * @see Serializable
 */
public class ObjetoConstructor implements Serializable{
    private static final long serialVersionUID = 3298647669563298115L;

    private int id;
    private int idComponente;
    private String strClassPath;
    private int orden;    
    private ArrayList<ParametroObjetoConstructor> objParametros;

    /**
     * Constructor por defecto de la clase
     */
    public ObjetoConstructor() {
        this.orden = -1;
        this.id = 0;        
        this.objParametros = new ArrayList<ParametroObjetoConstructor>();
    }

    /**
     * Constructor por defecto de la clase
     * @param id Identificador Interno del Objeto.
     * @param idConstructor Identificador Obtenido por Procesos de Reflexión.
     */
    public ObjetoConstructor(int id, int idConstructor) {
        this.id = id;
        this.orden = idConstructor;        
        this.objParametros = new ArrayList<ParametroObjetoConstructor>();
    }

    /**
     * Constructor por defecto de la clase
     * @param id Identificador Interno del Objeto.
     * @param idConstructor Identificador Obtenido por Procesos de Reflexión.
     * @param objParametros Coleccion de Objetos que Representan los Parametros del Constructor.
     */
    public ObjetoConstructor(int id, int idConstructor, ArrayList<ParametroObjetoConstructor> objParametros) {
        this.id = id;
        this.orden = idConstructor;        
        this.objParametros = new ArrayList<ParametroObjetoConstructor>();
    }   

    /**
     * Constructor de la clase
     * @param id Identificador Interno del Objeto.
     * @param strClassPath Classpath que representa la Definicón del Constructor.
     * @param idConstructor Identificador Obtenido por Procesos de Reflexión.
     * @param objParametros Coleccion de Objetos que Representan los Parametros del Constructor.
     */
    public ObjetoConstructor(int id, String strClassPath, int idConstructor, ArrayList<String> objParametros) {
        this.id = id;
        this.strClassPath = strClassPath;
        this.orden = idConstructor;        
        this.objParametros = new ArrayList<ParametroObjetoConstructor>();
    }

    /**
     * Constructor de la clase
     * @param id Identificador Interno del Objeto.
     * @param idConstructor Identificador Obtenido por Procesos de Reflexión.
     * @param idComponente Identificador que Representa el Objeto Asociado en la Representación.
     * @param strClassPath Classpath que representa la Definicón del Constructor.
     */
    public ObjetoConstructor(int id, int idConstructor, int idComponente, String strClassPath) {
        this.id = id;
        this.idComponente = idComponente;
        this.strClassPath = strClassPath;
        this.orden = idConstructor;        
        this.objParametros = new ArrayList<ParametroObjetoConstructor>();
    }

    /**
     * Devuelve el Orden del Constructor.
     * @return Orden del Constructor.
     */
    public int getOrden() {
        return orden;
    }

    /**
     * Establece el Orden del Constructor.
     * @param orden Orden del Constructor.
     */
    public void setOrden(int orden) {
        this.orden = orden;
    }   

    /**
     * Devuelve el Id del Constructor.
     * @return Id del Constructor.
     */
    public int getId() {
        return id;
    }

    /**
     * Establece el Id del Constructor.
     * @param id Id del Constructor.
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * Devuelve el Indice del Componente.
     * @return Indice del Componente.
     */
    public int getIdComponente() {
        return idComponente;
    }

    /**
     * Establece el Indice del Componente.
     * @param idComponente Indice del Componente.
     */
    public void setIdComponente(int idComponente) {
        this.idComponente = idComponente;
    }

    /**
     * Devuelve el Classpath del Constructor.
     * @return Classpath del Constructor.
     */
    public String getStrClassPath() {
        return strClassPath;
    }

    /**
     * Establece el Classpath del Constructor.
     * @param strClassPath Classpath del Constructor.
     */
    public void setStrClassPath(String strClassPath) {
        this.strClassPath = strClassPath;
    }

    /**
     * Devuelve la Colección que Representa los Parametros del Constructor.
     * @return Colección que Representa los Parametros del Constructor.
     */
    public ArrayList<ParametroObjetoConstructor> getObjParametros() {
        return objParametros;
    }

    /**
     * Establece el Colección que Representa los Parametros del Constructor.
     * @param objParametros Colección que Representa los Parametros del Constructor.
     */
    public void setObjParametros(ArrayList<ParametroObjetoConstructor> objParametros) {
        this.objParametros = objParametros;
    }
    
    /**
     * Agrega un Nuevo Parametro a la Colección de Parametros del Constructor.
     * @param objParametro Nuevo Parametro.
     */
    public void addParametro(ParametroObjetoConstructor objParametro){
       try{
            objParametro.idColeccion = this.objParametros.size();
            this.objParametros.add(objParametro);
        }catch(java.lang.Exception ex){}
        
    }
    
    /**
     * Actualiza un Parametro de la Colección de Parametros del Constructor.
     * @param objParametro Parametro de la Colección de Parametros del Constructor.
     */
    public void setParametro(ParametroObjetoConstructor objParametro){
        try{
            this.objParametros.set(objParametro.idColeccion, objParametro);
        }catch(java.lang.Exception ex){}        
    }
    
    /**
     * Elimina el Parametro de la Colección de Parametros del Constructor representado
     * en el indice..
     * @param i Indice del Parametro que se eliminará.
     */
    public void delParametro(int i){
        try{
            this.objParametros.remove(i);
        }catch(java.lang.Exception ex){}
        
    }
    
    /**
     * Devuelve la Colección de Valores de los Parametros del Constructor.
     * @return Colección de Valores de los Parametros del Constructor.
     */
    public ArrayList<Object> getValoresParametros(){
        ArrayList<Object> objValores = new ArrayList<Object>();
        for(ParametroObjetoConstructor objParametro : objParametros){
            objValores.add(objParametro.getObjValue());
        }
        return objValores;
    }

//    @Override
//    protected Object clone() {
//        ObjetoConstructor objClon = null;    
//        try {
//            //Primero se Clona la Referencia Local
//            objClon = (ObjetoConstructor) super.clone();
//        } catch (CloneNotSupportedException ex) {
//            Logger.getLogger(ObjetoConstructor.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        //Ahora se hace la Clonación Profunda
//        if(objParametros != null){
//            ((ObjetoConstructor)objClon).setObjParametros((ArrayList<ParametroObjetoConstructor>) objParametros.clone());
//        }
//        if(strClassPath != null){
//            ((ObjetoConstructor)objClon).setStrClassPath(new String(strClassPath.toCharArray()));
//        }        
//        return objClon;
//    }
    
    
}
